unit asciiart;
// Данный модуль распространяется под GNU GPL версии 3 или более поздней

interface
uses CRT;

const
  sdLeft = 0;
  sdRight = 2;

type
  PAAPixel = ^TAAPixel;		// Один символ аскиарта, можно считать
  TAAPixel = object		// в данном случае пикселем,
    X,Y: integer;		// потому что он неделим
    Color: integer;
    symbol: char;
    Next: PAAPixel;
  end;

  TAAPixelGroup=object		// Группа символов
    Left, Top: integer;		// Координаты левого верхнего угла
    Pixels: PAAPixel;		// Собственно символы
    Procedure AddPixel(px,py,fc: integer; s: char);
    Procedure Draw;
    Procedure LoadFromFile(fname: string);
  end;

implementation

Procedure TAAPixelGroup.AddPixel(px,py,fc: integer; s: char);
// Процедура добавляет в группу "пикселей" один "пиксель"
// с заданными координатами (относительно левого верхнего угла группы),
// цветом и символом
// ВНИМАНИЕ: процедура содержит костыль
var P: PAAPixel;
begin
  // Pixels=nil если данный символ - первый
  if Pixels=nil then
    begin
      New(Pixels);
      with Pixels^ do
	begin
	  X:=px;
	  Y:=py;
	  Color:=fc;
	  Symbol:=s;
	end;
    end
  else
    begin
      P:=Pixels;	// В ином случае, находим последний символ
      while not (P^.Next=nil) do	// и добавляем
	P:=P^.Next;
      New(P^.Next);
      With P^.Next^ do
	begin
	  X:=px;
	  Y:=py;
	  Color:=fc;
	  Symbol:=s;
	end;
    end;
end;

Procedure TAAPixelGroup.Draw;
// Отрисовка группы символов
var P: PAAPixel;
begin
  P:=Pixels;
  while not (P=nil) do
    with P^ do
      begin
	GotoXY(X+Left,Y+Top);
	TextColor(Color);
	Write(Symbol);
	P:=Next;
      end;
end;



Procedure TAAPixelGroup.LoadFromFile(fname: string);
// Загрузка группы символов из файла
var f: text;
  x,y,c: integer;
  s: string;
begin
  Assign(f, fname);
  Reset(f);
  while not EOF(f) do
    begin
      Readln(f,x,y,c,s);
      AddPixel(x,y,c,s[2]);
    end;
end;

end.